﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Configuration;
using System.Data.SqlClient;
using System.Data;
using System.Collections;

public partial class ventas : System.Web.UI.Page
{
    private static ArrayList array = new ArrayList();
    private static int[] cod_producto = new int[12];
    private static int[] cantidad = new int[12];
    private static ArrayList nombreProducto = new ArrayList();
    private static int posicion_fila = 0;
    

    //Creo un objeto DataTable que representará una tabla con el nombre Tabla1
    private static DataTable table = new DataTable("Tabla1");
    private static int contador=0;
    private static int numero_factura;
    private static int valor_restante_a_pagar=1;
    
    

    protected void Page_Load(object sender, EventArgs e)
    {
        imgbt_Clientes.Attributes.Add("OnClick", "javascript:popUpClientes();");
        imgbt_Producto.Attributes.Add("OnClick", "javascript:popUpProductos();");
        lb_Fecha.Text = System.DateTime.Now.ToString();

        //Si la factura no se ha guardado todavia. Averigua el siguiente codigo de factura
        if (contador == 0)
        {
            String cadena = (String)ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
            SqlConnection conexion5 = new SqlConnection(cadena);
            try
            {
                conexion5.Open();
                SqlCommand Cod_Factura = new SqlCommand();
                Cod_Factura.CommandText = "select coalesce(max(cod_factura),0)+1 from factura";
                Cod_Factura.Connection = conexion5;
                Cod_Factura.CommandType = CommandType.Text;
                SqlDataReader read1 = Cod_Factura.ExecuteReader();
                read1.Read();
                numero_factura = Convert.ToInt32(read1.GetValue(0).ToString());
                txt_numero_factura.Text = read1.GetValue(0).ToString();
            }
            catch (Exception error)
            {
                Page.RegisterStartupScript("alerta", "<SCRIPT> alerta(" + error.Message.ToString() + ") </SCRIPT>");
            }
            finally
            {
                conexion5.Close();
            }
            lb_Estado.Text = "Activo";
            lb_FacturaGuardada.Text = "no";
            contador = contador + 1;
        }

    }

    public void guardar_factura_cabecera(){
        
            String cadena = (String)ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
            SqlConnection conexion = new SqlConnection(cadena);
            conexion.Open();            
                try
                {

                    SqlCommand comando = new SqlCommand();
                    comando.Connection = conexion;
                    comando.CommandType = System.Data.CommandType.StoredProcedure;
                    comando.CommandText = "insertar_factura";
                    comando.Parameters.AddWithValue("@cod_cliente",txt_cod_cliente.Text );
                    comando.Parameters.AddWithValue("@cod_funcionario", 1);
                    SqlDataReader reader = comando.ExecuteReader();
                    //lb_Estado.Text = "Activo";

                }
                catch (Exception error)
                {
                    Page.RegisterStartupScript("alerta", "<SCRIPT> alerta(" + error.Message.ToString() + ") </SCRIPT>");

                }
                finally
                {
                    conexion.Close();
                }
            }
        

    protected void imgbt_agregar_producto_Click(object sender, ImageClickEventArgs e)
    {
        tr_guardar_producto.Visible = true;
        GView_Detalle_Factura.DataSource = table;
        GView_Detalle_Factura.DataBind();
        
    }
    protected void imgbt_guardar_factura_Click(object sender, ImageClickEventArgs e)
    {
        if (L_FacturaGuardada.Text == "no")
        {
            if (txt_cod_cliente.Text == "")
            {
                lb_Error_Cliente.Visible = true;
                lb_Error_Texto.Visible = true;
            }
            else
            {
                if (posicion_fila > 0)
                {
                    guardar_factura_cabecera();
                    int temp = 0;
                    String cadena = (String)ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
                    SqlConnection conexion = new SqlConnection(cadena);
                    while (cod_producto[temp] != 0)
                    {
                        //Aqui se agrega el producto

                        try
                        {
                            conexion.Open();
                            //Insertar un detalle
                            SqlCommand command = new SqlCommand("insertar_factura_detalle", conexion);
                            command.CommandType = System.Data.CommandType.StoredProcedure;
                            command.Parameters.AddWithValue("@cod_factura", numero_factura);
                            command.Parameters.AddWithValue("@cantidad", cantidad[temp]);
                            command.Parameters.AddWithValue("@cod_producto", cod_producto[temp]);

                            SqlDataReader reader = command.ExecuteReader();


                            reader.Close();


                        }
                        catch (Exception error)
                        {
                            Page.RegisterStartupScript("alerta", "<SCRIPT> alerta(" + error.Message.ToString() + ") </SCRIPT>");
                        }
                        finally
                        {


                            conexion.Close();
                        }
                        temp = temp + 1;
                    }

                    conexion.Open();
                    SqlCommand importe_total = new SqlCommand();
                    importe_total.CommandText = "select total_con_iva from factura where cod_factura=" + numero_factura;
                    importe_total.Connection = conexion;
                    importe_total.CommandType = CommandType.Text;
                    SqlDataReader importe_total_reader = importe_total.ExecuteReader();
                    importe_total_reader.Read();
                    txt_total_a_pagar.Text = importe_total_reader.GetValue(0).ToString();
                    importe_total_reader.Close();
                    conexion.Close();


                    tr_guardar_cabecera.Visible = false;
                    tb_pagos.Visible = true;
                    guardarCabereraPagos();
                    compararDeuda();
                    L_FacturaGuardada.Text = "si";

                    posicion_fila = 0;
                    lb_Error_Cliente.Visible = false;
                    lb_Error_Texto.Visible = false;
                }
            }
        }
        GView_Detalle_Factura.DataSource = table;
        GView_Detalle_Factura.DataBind();
    }

    protected void compararDeuda()
    {
        String total_pagado;
        String cadena = (String)ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
        SqlConnection conexion = new SqlConnection(cadena);
        try
        {
            conexion.Open();
            SqlCommand importe_total = new SqlCommand();
            importe_total.CommandText = "select total_con_iva from pagos where cod_factura=" + numero_factura;
            importe_total.Connection = conexion;
            importe_total.CommandType = CommandType.Text;
            SqlDataReader importe_total_reader = importe_total.ExecuteReader();
            importe_total_reader.Read();
            total_pagado = importe_total_reader.GetValue(0).ToString();
            importe_total_reader.Close();
            if (total_pagado == null)
            {
                total_pagado = "0";
            }

            //txt_valor_restante.Text = Convert.ToString((Convert.ToInt32(txt_total_a_pagar.Text) - Convert.ToInt32(total_pagado)));
            valor_restante_a_pagar = (Convert.ToInt32(txt_total_a_pagar.Text) - Convert.ToInt32(total_pagado));
            txt_valor_restante.Text = Convert.ToString(valor_restante_a_pagar);
        }
        catch (Exception error)
        {
            Page.RegisterStartupScript("alerta", "<SCRIPT> alerta(" + error.Message.ToString() + ") </SCRIPT>");
            //Label3.Text = error.Message.ToString();
        }
        finally
        {
            conexion.Close();
        }

    }

    protected void imgbt_buscar_factura_Click(object sender, ImageClickEventArgs e)
    {
        
        GridView_Factura_Detalles.DataBind();
    }

    protected void GView_Factura_Ventas_RowCommand(Object sender, GridViewCommandEventArgs e)
    {
        if (e.CommandName == "Leer")
        {
            GridView_Facturas.SelectedIndex = Convert.ToInt32(e.CommandArgument);
            String cod_Factura1 = GridView_Facturas.SelectedRow.Cells[0].Text;
            txt_Codigo_Factura_Seleccionada.Text = cod_Factura1;
        }
    }
    private void guardarCabereraPagos(){
        String cadena = (String)ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
        SqlConnection conexion = new SqlConnection(cadena);
        try
        {

            SqlCommand comando = new SqlCommand();
            conexion.Open();
            comando.Connection = conexion;
            comando.CommandType = System.Data.CommandType.StoredProcedure;
            comando.CommandText = "insertar_pagos";
            comando.Parameters.AddWithValue("@cod_factura", numero_factura);
            SqlDataReader reader = comando.ExecuteReader();
            reader.Close();

            


        }
        catch (Exception error)
        {
            Page.RegisterStartupScript("alerta", "<SCRIPT> alerta(" + error.Message.ToString() + ") </SCRIPT>");
        }
        finally
        {
            conexion.Close();
        }
       
    }
    public void limpiar_campos_pagos() {
        txt_monto.Text = "";
        txt_numero_cuenta.Text = "";
        txt_cuenta_bancaria.Text = "";
    }
    protected void imgbt_finalizar_Pago_Click(object sender, ImageClickEventArgs e)
    {
        //if (Convert.ToInt32(txt_valor_restante.Text) > 0)
        if(valor_restante_a_pagar > 0){

            Page.RegisterStartupScript("alerta", "<SCRIPT> alerta('No se ha realizado en su totalidad el pago de la factura') </SCRIPT>");
            tb_pagos.Visible = true;
            compararDeuda();
            GView_Detalle_Factura.DataSource = table;
            GView_Detalle_Factura.DataBind();
        }
        else
        {

            lb_Estado.Text = "Finalizado";
            contador = 0;
            table.Columns.Clear();
            table.Clear();
            GridView_Facturas.DataBind();
            txt_cod_cliente.Text = "";
            txt_nombre_cliente.Text = "";
            txt_total_a_pagar.Text = "";
            limpiar_campos_pagos();
        }
    }
    protected void imgbt_agregar_Pago_Click(object sender, ImageClickEventArgs e)
    {
        if (txt_monto.Text != "")
        {

            if (valor_restante_a_pagar < Convert.ToInt32(txt_monto.Text))
            {

                Page.RegisterStartupScript("alerta", "<SCRIPT> alerta('El valor supera al importe de la factura') </SCRIPT>");
            }
            else
            {

                String cadena = (String)ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
                SqlConnection conexion = new SqlConnection(cadena);
                SqlConnection conexion2 = new SqlConnection(cadena);
                try
                {

                    SqlCommand comando = new SqlCommand();
                    SqlCommand Cod_Pagos = new SqlCommand();
                    conexion.Open();
                    conexion2.Open();


                    Cod_Pagos.CommandText = "select coalesce(max(cod_pagos),0) from pagos";
                    Cod_Pagos.Connection = conexion2;
                    Cod_Pagos.CommandType = CommandType.Text;
                    SqlDataReader read2 = Cod_Pagos.ExecuteReader();
                    read2.Read();
                    lb_numero_pago.Text = read2.GetValue(0).ToString();


                    comando.Connection = conexion;
                    comando.CommandType = System.Data.CommandType.StoredProcedure;
                    comando.CommandText = "insertar_pagos_detalles";
                    comando.Parameters.AddWithValue("@cod_pagos", Convert.ToInt32(lb_numero_pago.Text));
                    comando.Parameters.AddWithValue("@cod_forma_de_pago", dl_forma_de_pago.Text);
                    comando.Parameters.AddWithValue("@numero", txt_numero_cuenta.Text);
                    comando.Parameters.AddWithValue("@cuenta", txt_cuenta_bancaria.Text);
                    comando.Parameters.AddWithValue("@cantidad", txt_monto.Text);
                    SqlDataReader reader = comando.ExecuteReader();


                }
                catch (Exception error)
                {
                    Page.RegisterStartupScript("alerta", "<SCRIPT> alerta(" + error.Message.ToString() + ") </SCRIPT>");
                }
                finally
                {
                    conexion.Close();
                    conexion2.Close();
                }
            }
        }
        compararDeuda();
        limpiar_campos_pagos();
        tb_pagos.Visible = true;
        GView_Detalle_Factura.DataSource = table;
        GView_Detalle_Factura.DataBind();
        GridView_pagos.DataBind();
    }

    protected void b_aceptar_Click(object sender, EventArgs e)
    {
        if (txt_cod_cliente.Text == "")
        {
            lb_Error_Producto.Visible = true;
            lb_Error_Texto.Visible = true;
        } if (txt_cantidadTex.Text == "")
        {
            lb_Error_Cantidad.Visible = true;
            lb_Error_Texto.Visible = true;
        }
        if (txt_cod_producto.Text != "" && txt_cantidadTex.Text != "")
        {
            cod_producto[posicion_fila] = Convert.ToInt32(txt_cod_producto.Text);
            cantidad[posicion_fila] = Convert.ToInt32(txt_cantidadTex.Text);

            DataRow fila = table.NewRow();
            if (posicion_fila == 0)
            {
                table.Columns.Clear();
                table.Clear();
                DataColumn column1 = new DataColumn();
                DataColumn column2 = new DataColumn();
                DataColumn column3 = new DataColumn();
                DataColumn column4 = new DataColumn();
                column1.ColumnName = "Codigo ";
                column2.ColumnName = "Producto ";
                column3.ColumnName = "Cantidad ";
                column4.ColumnName = "Total";

                column1.DataType = System.Type.GetType("System.Int32");
                column2.DataType = System.Type.GetType("System.String");
                column3.DataType = System.Type.GetType("System.Int32");
                column4.DataType = System.Type.GetType("System.Int32");


                table.Columns.Add(column1);
                table.Columns.Add(column2);
                table.Columns.Add(column3);
                table.Columns.Add(column4);

 

                //cargarFilas
                fila["Codigo "] = System.Int32.Parse(txt_cod_producto.Text);
                fila["Producto "] = txt_nombre_Producto.Text;
                fila["Cantidad "] = System.Int32.Parse(txt_cantidadTex.Text);
                fila["Total"] = System.Int32.Parse(txt_cantidadTex.Text) *
                    (System.Int32.Parse(txt_precio_producto.Text) + (System.Int32.Parse(txt_precio_producto.Text))/10);
                table.Rows.Add(fila);

            }
            else
            {
                //cargarFilas
                fila["Codigo "] = System.Int32.Parse(txt_cod_producto.Text);
                fila["Producto "] = txt_nombre_Producto.Text;
                fila["Cantidad "] = System.Int32.Parse(txt_cantidadTex.Text);
                fila["Total"] = System.Int32.Parse(txt_cantidadTex.Text) *
                    (System.Int32.Parse(txt_precio_producto.Text) + (System.Int32.Parse(txt_precio_producto.Text)) / 10);
                table.Rows.Add(fila);
            }
            limpiar_campos_producto();
            GView_Detalle_Factura.DataSource = table;
            GView_Detalle_Factura.DataBind();
            posicion_fila = posicion_fila + 1;
            lb_Error_Cantidad.Visible = false;
            lb_Error_Producto.Visible = false;
            lb_Error_Texto.Visible = false;
            tr_guardar_producto.Visible=false;
        }
    }
    private void limpiar_campos_producto()
    {
        txt_nombre_Producto.Text = "";
        txt_cantidadTex.Text = "";
        txt_precio_producto.Text = "";
        txt_cod_producto.Text = "";
    }
    protected void b_cancelar_Click(object sender, EventArgs e)
    {
        limpiar_campos_producto();
        tr_guardar_producto.Visible = false;
        GView_Detalle_Factura.DataSource = table;
        GView_Detalle_Factura.DataBind();
    }


    protected void imgbt_cancelar_factura_Click(object sender, ImageClickEventArgs e)
    {
        limpiar_campos_producto();
        txt_nombre_cliente.Text = "";
        txt_cod_cliente.Text = "";
        table.Columns.Clear();
        table.Clear();
        contador = 0;
    }
    protected void imgbt_buscar_Click(object sender, ImageClickEventArgs e)
    {
        ReportViewer1.LocalReport.Refresh();
    }

}
